package A2016;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/*
比如，序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在变换过程为：
a1: 1未出现过，所以a1变为-1；
a2: 2未出现过，所以a2变为-2；
a3: 2出现过，最后一次为原序列的a2，在a2后、a3前有0种数字，所以a3变为0；
a4: 1出现过，最后一次为原序列的a1，在a1后、a4前有1种数字，所以a4变为1；
a5: 2出现过，最后一次为原序列的a3，在a3后、a5前有1种数字，所以a5变为1。
现在，给出原序列，请问，按这种变换规则变换后的序列是什么。
输入格式：
输入第一行包含一个整数n，表示序列的长度。
第二行包含n个正整数，表示输入序列。
输出格式：
输出一行，包含n个数，表示变换后的序列。
例如，输入：
5
1 2 2 1 2
程序应该输出：
-1 -2 0 1 1
再例如，输入：
12
1 1 2 3 2 3 1 2 2 2 3 1
程序应该输出：
-1 0 -2 -3 1 1 2 2 0 0 2 2
数据规模与约定
对于30%的数据，n<=1000；
对于50%的数据，n<=30000；
对于100%的数据，1 <=n<=100000，1<=ai<=10^9
资源约定：
峰值内存消耗（含虚拟机） < 256M
CPU消耗  < 3000ms
 */
public class _10_压缩变换 {
	static Map<Integer,Integer> lastIndex = new HashMap<Integer,Integer>();
	private static int[] arr;//记录原始数据
	private static int[] ans;//记录答案
	private static int N;
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		N =sc.nextInt();
		arr=new int[N];
		ans=new int[N];
		
		for(int i=0;i<N;i++) {
			int num=sc.nextInt();
			arr[i]=num;
			if(lastIndex.get(num)==null) {
				ans[i]=-num;
			}else {//统计p_num和i之间有多少不同的数
				Set<Integer> set =new HashSet<Integer>();
				for(int j=lastIndex.get(num)+1;j<i;j++) {
					set.add(arr[j]);
				}
				ans[i]=set.size();
			}
			lastIndex.put(num, i);
		}
		
		
		for(int k=0;k<N;k++) {
			System.out.print(ans[k]+" ");
		}System.out.println();
	}

}
